package testjeu;


import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;

/**
 * Les balles tirées par le tank joueur
 * @author YoTsumi
 * @see Balles
 */
public class Balle {

    private Image sprite;
    
    private int x;
    private int y;
    private int angle;
    
    private boolean estEnnemi;
    
    /**
     * Initialise une balle en fonction de sa position d'origine et de son angle
     * 
     * @param colTank       Colone du tank qui tire
     * @param ligTank       Ligne du tank qui tire
     * @param angleTank     Angle désirée pour la balle
     * @param ennemi		Vrai = Tank ennemi
     * @throws org.newdawn.slick.SlickException
     */
    public Balle(int colTank, int ligTank, int angleTank, boolean ennemi) throws SlickException {
        x=cases.colToPxl(colTank);
        y=cases.ligToPxl(ligTank);
        
        angle=angleTank;
        estEnnemi=ennemi;
        
        // On charge l'image
        if (!estEnnemi) sprite=new SpriteSheet("res/sprite_tank.png", 40, 40).getSprite(1, 9);
        else 			sprite=new SpriteSheet("res/sprite_tankEnnemis.png", 40, 40).getSubImage(4,2);
        sprite.setRotation(angle); 
        
        // Met la balle dans la case adjacente à celle du tank, dans l'angle désiré
        switch(angle) {
            default:
            case 0:   x+=20; break;
            case 45:  x+=20; y+=20; break; 
            case 90:  y+=20;  break;
            case 135: x-=20; y+=20; break;
            case 180: x-=20;  break;
            case 225: x-=20; y-=20; break;
            case 270: y-=20; break;
            case 315: y-=20; x+=20; break;
        }
        
        
        
    }
    
    /**
     * Affiche le sprite de la balle
     */
    public void dessiner() {
        sprite.draw(x,y);
        
    }
    
    /**
     * Déplace la balle suivant son angle à vitesse fixe ( en fonction du delta )
     * @param delta     Le temps passé depuis le dernier appel
     */
    public void update(int delta) {
        int deplacement=(estEnnemi()) ? delta/4 : delta/3;
        
         switch(angle) {
            default:
            case 0:   x+=deplacement; break;
            case 45:  x+=deplacement; y+=deplacement; break;
            case 90:  y+=deplacement; break;
            case 135: x-=deplacement; y+=deplacement; break;
            case 180: x-=deplacement; break;
            case 225: x-=deplacement; y-=deplacement; break;
            case 270: y-=deplacement; break;
            case 315: x+=deplacement; y-=deplacement; break;
        }       
         
    }
    
    /**
     * Retourne les coordonnées (x,y) de la balle recadrée
     * @return  Vecteur : [0]=coord X, [1]=coord Y
     */
    public int[] coord() {
    	
    	int[] coord = {x,y};
    	if (angle%90!=0) { coord[0]+=20; coord[1]+=20; }
        return coord;
    }
    
    /**
     * Indique si la balle provient d'un tank Ennemi
     * @return	Vrai si la balle a été tirée par un tank ennemi
     */
    public boolean estEnnemi() {
    	return estEnnemi;
    }
    
    public int angle() {
    	return angle;
    }
    
}
